﻿#define  _CRT_SECURE_NO_WARNINGS 1
//数组做函数的参数
//⽐如：写⼀个函数将⼀个整型数组的内容，全部置为 - 1，再写⼀个函数打印数组的内容。
#include <stdio.h>
//void set_arr(int arr[10],int sz) //10写不写都可以
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		arr[i] = -1;
//	}
//}
//void print_arr(int arr[10], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");//每次调用此函数打印的信息都在不同行
//}
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//下标0-9
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//写一个函数把数组的内容全部变为-1
//	set_arr(arr,sz ); //传参传数组的时候，写数组名就可以
// print_arr(arr,sz);  //用于打印数组
//	return 0;
//}
//这样更好，我想初始化什么我改变set就行
//void set_arr(int arr[10], int sz,int set) //10写不写都可以
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		arr[i] = set;
//	}
//}
//void print_arr(int arr[10], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//下标0-9
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//写一个函数把数组的内容全部变为-1
//	print_arr(arr, sz);
//	set_arr(arr, sz,-1); //传参传数组的时候，写数组名就可以
//	print_arr(arr, sz);  //打印出来就是12345678910一行 -1-1那些一行
//
//	return 0;
//}
//数组在传参数的时候，实参就写数组名就行，形参也是数组的形式
//实参和形参的名字是可以一样的也可以不一样
//函数在设计的时候，一定要功能单一
//数组在传参的时候实参和形参是同一个数组和之前的变量不一样
//这⾥我们需要知道数组传参的⼏个重点知识：
//• 函数的形式参数要和函数的实参个数匹配
//• 函数的实参是数组，形参也是可以写成数组形式的
//• 形参如果是⼀维数组，数组⼤⼩可以省略不写
//• 形参如果是⼆维数组，⾏可以省略，但是列不能省略
//• 数组传参，形参是不会创建新的数组的
//• 形参操作的数组和实参的数组是同⼀个数组
//void print(int arr[][5], int r, int c)  //这里把3省略没问题但是不可以把五省略了
//{
//	int i = 0;
//	for (i = 0; i < r; i++)
//	{
//		int j = 0;
//		for (j = 0; j < c; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
//	//打印二维数组的内容
//	print(arr, 3, 5);
//	return 0;
//}

//假设我们计算某年某⽉有多少天？如果要函数实现，可以设计2个函数:
//• is_leap_year()：根据年份确定是否是闰年
//• get_days_of_month()：调⽤is_leap_year确定是否是闰年后，再根据⽉计算这个⽉的天数
//31 28 31 30 31  30 31 31 30 31 30 31基本都是固定的
//只要闰年2月29天

//int is_leap_year(int y)
//{
//	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
//		return 1;
//	else
//		return 0;
//}
//
//int get_days_of_month(int y, int m)
//{
//	int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; //放到一个数组里
//	//但是下标没有和月份对上，我们可以在前面加个0
//	int day = days[m];
//	if (is_leap_year(y) == 1 && m == 2) //是闰年   这就是函数的嵌套调用
//	{
//		day++;
//	}
//	return day;
//}
//
//int main()
//{
//	int year = 0;
//	int month = 0;
//	scanf("%d %d", &year, &month);
//	//计算某年某月有多少天
//	int day = get_days_of_month(year, month);
//	printf("%d\n", day);
//	return 0;
//}

//返回只有两种
//是闰年-真
//不是闰年-假
//所以可以用布尔类型
#include <stdbool.h>
//bool is_leap_year(int y)
//{
//	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))  //这是函数的定义
//		return true;
//	else
//		return false;
//}
//
//int get_days_of_month(int y, int m)  
//{
//	int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; //放到一个数组里
//	//但是下标没有和月份对上，我们可以在前面加个0
//	int day = days[m];
//	if (is_leap_year(y) && m == 2) //此处判断等于1可以不写，因为上面return返回1为真，已经为真了  //这是函数的调用
//	{
//		day++;
//	}
//	return day;
//}
//
//int main()
//{
//	int year = 0;
//	int month = 0;
//	scanf("%d %d", &year, &month);
//	//计算某年某月有多少天
//	int day = get_days_of_month(year, month);
//	printf("%d\n", day);
//	return 0;
//}

//嵌套调⽤就是函数之间的互相调⽤，每个函数就像⼀个乐⾼零件，正是因为多个乐⾼的零件互相⽆缝
//的配合才能搭建出精美的乐⾼玩具，也正是因为函数之间有效的互相调⽤，最后写出来了相对⼤型的
//程序。
//所谓链式访问就是将⼀个函数的返回值作为另外⼀个函数的参数，像链条⼀样将函数串起来就是函数
//的链式访问。
#include <string.h>
//int main()
//{
//	//int len = strlen("abcdef");
//	//printf("%d\n", len);  //如何合成一行代码呢
//	printf("%d\n", strlen("abcdef"));  //这就是链式访问
//	return 0;
//}

//int main()
//{
//	//printf("%d", printf("%d", printf("%d", 43)));  //打印出了4321
//	//第一步打印出43  然后返回值2
//	//第二步打印2  然后返回值1
//	//第三步打印3  
//	//所以最终是4321
//	printf("%d ", printf("%d ", printf("%d ", 43)));//结果是43 3 2   空格也是字符噢
//
//
//
//	//printf 他的返回值是字符个数
//	int r = printf("ehhe");
//	printf("%d\n", r);  //打印结果就是4
//	return 0;
//}

//bool is_leap_year(int y)
//{
//	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
//		return true;
//	else
//		return false;
//}
//int main()
//{
//	int year = 0;
//	scanf("%d", &year);
//	if (is_leap_year(year))
//	{
//		printf("%d 是闰年\n", year);
//	}
//	else
//	{
//		printf("%d 不是闰年\n", year);
//	}
//	return 0;
//}  //我们一般都是这样写代码，但是有时会有人把函数的定义写到main函数的后面

//int is_leap_year(int y);//函数的声明
//int is_leap_year(int);//函数的声明中，形参的名字可以省略
//函数的定义是一种特殊的声明
//
//int main()
//{
//	int year = 0;
//	scanf("%d", &year);
//	if (is_leap_year(year))
//	{
//		printf("%d 是闰年\n", year);
//	}
//	else
//	{
//		printf("%d 不是闰年\n", year);
//	}
//	return 0;
//}
//int is_leap_year(int y)
//{
//	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
//		return 1;
//	else
//		return 0;
//}//报错 is_leap_year”未定义；假设外部返回 int  因为编译器是从上往下一行一行运行的 编译器以为没有定义
//函数或者变量都要满足先声明后使用  可以在main函数前定义这个函数即可int is_leap_year(int y)

 

//int Add(int x, int y);  //声明
////或者写成多个文件的形式  建一个源文件add.c和头文件add.h
////头文件里放函数声明  源文件放函数的实现(定义)
// 把add.h和add.c当成一个模块
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	int c = Add(a, b);
//	printf("%d", c);
//	return 0;
//}
//
//int Add(int x, int y)
//{
//	return x + y;
//}

//#include "add.h"  //这样就能直接用这个函数
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	int c = Add(a, b);
//	printf("%d", c);
//	return 0;
//}
//把大型复杂的程序，拆分成多个文件的好处
//团队协作
//代码模块化，逻辑清晰
//代码隐藏（卖代码的时候有用）
//static 和 extern
//static 和 extern 都是C语⾔中的关键字。
//static 是 静态的 的意思，可以⽤来：
//• 修饰局部变量
//• 修饰全局变量
//• 修饰函数
//extern 是⽤来声明外部符号的。
//作⽤域（scope）是程序设计概念，通常来说，⼀段程序代码中所⽤到的名字并不总是有效（可⽤）
//的，⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。
//1. 局部变量的作⽤域是变量所在的局部范围。
//2. 全局变量的作⽤域是整个⼯程（项⽬）。
//⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
//1. 局部变量的⽣命周期是：进⼊作⽤域变量创建，⽣命周期开始，出作⽤域⽣命周期结束。
//2. 全局变量的⽣命周期是：整个程序的⽣命周期。

//int main()
//{
//	{
//		int a = 100;
//		printf("1 a=%d\n", a);//这个括号就是a的作用域
//
//	}printf("2 a=%d\n", a); //编译的时候这个a就不能用
//	return 0;
//}

//如果在另一个文件.c中创建了全局变量a
//我想在这个文件中使用这个变量
//则 extern int a    extern用来声明外部符号的


//int main()
//{
//	{
//		int a = 100;//a的创建  生命刚开始
//		printf("a=%d\n", a);//出了这个括号就没生命了
//	}
//	printf("a=%d\n", a);
//}



